﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ClienteWinMGI.Presentacion;
using ComunesMGI.Mensajes;

namespace ClienteWinMGI.Presentacion
{
    public partial class ReporteIncidentesCreadosPeriodo : Form
    {
        private const string TODOS_LOS_CLIENTES = "<Todos los Clientes>";
        private const string TODOS_LOS_SISTEMAS = "<Todos los Sistemas>";
        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;

        public ReporteIncidentesCreadosPeriodo()
        {
            InitializeComponent();
            cargarClientes();
            clearValidator();
            hideLoader();
        }

        private void showLoader()
        {
            picLoader.Visible = true;
        }
        private void hideLoader()
        {
            picLoader.Visible = false;
        }

        private void clearValidator()
        {
            imgValidator.Visible = false;
            lblValidator.Visible = false;
        }

        private void showValidator(string textoValidator)
        {
            imgValidator.Visible = true;
            lblValidator.Visible = true;
            lblValidator.Text = textoValidator;
        }

        private void cargarClientes()
        {
            cboCliente.Items.Add(TODOS_LOS_CLIENTES);
            cboCliente.SelectedIndex = cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES);
            List<DataCliente> _ldc;
            IClientes _il = LogicaFactory.getInstance().getIClientes();
            _ldc = _il.GetClientes();
            foreach (DataCliente dc in _ldc)
            {
                cboCliente.Items.Add(dc.Nombre);
            }
            _clientes = _ldc;
            cboSistema.Enabled = true;
        }


        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            clearValidator();
            cboSistema.Items.Clear();
            cboSistema.Items.Add(TODOS_LOS_SISTEMAS);
            cboSistema.SelectedIndex = cboSistema.Items.IndexOf(TODOS_LOS_SISTEMAS);
            //if (cboCliente.SelectedIndex != -1 && cboCliente.SelectedItem.ToString().CompareTo(TODOS_LOS_CLIENTES)!=0 )
            if (cboCliente.SelectedIndex != cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES))
            {
                DataCliente actualDc = _clientes.First(ds => ds.Nombre == cboCliente.SelectedItem.ToString());
                ISistemas _sist = LogicaFactory.getInstance().getISistemas();
                List<DataSistema> _lista = _sist.GetSistemas(actualDc.Codigo);
                for (int i = 0; i < _lista.Count(); i++)
                {
                    DataSistema _dataSist = _lista[i];
                    string item = _dataSist.Nombre;
                    cboSistema.Items.Add(item);
                }
                _sistemasDeCliente = _lista;
            }
        }

        private void btnReporte_Click(object sender, EventArgs e)
        {
            showLoader();
            this.Refresh();
            this.Update();
            clearValidator();
            if (dTPFechaDesde.Value.CompareTo(dTPFechaHasta.Value) <= 0)
            {
                DataCliente _datoCliente = null;
                if (cboCliente.SelectedIndex != cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES))
                    _datoCliente = new DataCliente(cboCliente.SelectedItem.ToString());

                DataSistema _datoSistema = null;
                if (cboSistema.SelectedIndex != cboSistema.Items.IndexOf(TODOS_LOS_SISTEMAS))
                {
                    _datoSistema = _sistemasDeCliente.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());
                }

                IIncidentes _inc = LogicaFactory.getInstance().getIIncidentes();
                //en el caso de que la lista de sistemas no fuese seleccionada se envia una lista vacia
                //lo que significa que se traeran todos los sistemas de todos los clientes
                List<int> lds = new List<int>();
                if (_datoSistema != null)
                {
                    lds = new List<int>();
                    lds.Add(_datoSistema.Codigo);
                }
                else
                {
                    if (_datoCliente != null)
                    {
                        lds = new List<int>();
                        foreach (DataSistema _ds in _sistemasDeCliente)
                        {
                            lds.Add(_ds.Codigo);
                        }
                    }
                }
                List<DataIncidenteReporte> _licp = _inc.GetIncidentesCreadosPeriodo(lds, dTPFechaDesde.Value, dTPFechaHasta.Value);
                if (_licp != null && _licp.Count > 0)
                {
                    FormReportes fr = new FormReportes();
                    fr.setReporteCreadosPeriodos();
                    fr.SetDataSourceReporteIncidentesCreados(_licp, dTPFechaDesde.Value, dTPFechaHasta.Value);
                    hideLoader();
                    fr.ShowDialog();

                }
                else
                {
                    hideLoader();
                    Error err = new Error("Error", "No existen incidentes creados para el periodo seleccionado.", "Modifique el periodo en el cual quiere visualizar los incidentes creados para poder generar el reporte.");
                    err.ShowDialog();
                }
            }
            else
            {
                hideLoader();
                Error err = new Error("Error", "Período de tiempo incorrecto.", "Modifique el periodo en el cual quiere visualizar los incidentes creados para poder generar el reporte.");
                err.ShowDialog();
            }
            hideLoader();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }


    }
}
